import axios, { AxiosResponse } from "axios";
import appConfig from "../../app.config";
import { WebSocketSingleton } from "./devSocket";
import { InitComponentSingleton } from "./devInitComponent";
import { ParamsType } from "@/types/model";

export const request = axios.create({
  //1,基础配置
  baseURL: `http://localhost:${appConfig.MOCK_PORT}/`,
  timeout: 5000, // 设置超时时间为5s
  responseType: "json",
});

// 设置请求拦截器
request.interceptors.request.use(
  (config) => {
    // 注入token到请求头中
    // config.headers.Authorization = `Bearer ${token}`;

    // 4 配置响应数据类型
    config.headers["Content-Type"] = "application/json";

    return config; // 必须返回配置
  },
  (error) => {
    return Promise.reject(new Error(error));
  }
);

// 响应拦截器（处理返回的数据）
request.interceptors.response.use(
  (res) => {
    //响应得统一处理
    return res.data;
  },
  (error) => {
    // 例如断网、跨域、状态码问题的报错
    // error.response.status 这里可以拿到接口真正的状态码，还是要看后端是怎么设计接口的
    // return Promise.reject(new Error(error));
    console.error("axios请求错误", error);
  }
);

/* 这是在ram开发模式下，对model.invoke的模拟 */
export const invoke = (methodName: string, params: ParamsType) => {
  if (appConfig.DEV_RAM_REQUEST_TYPE === "axios") {
    request({
      url: `api/${methodName}`,
      method: "post",
      data: {
        params,
      },
    }).then((res: AxiosResponse<any, any>) => {
      const InitComponent = InitComponentSingleton.getInstance();
      // @ts-ignore
      if (res) InitComponent.update(res);
    });
  }
  if (appConfig.DEV_RAM_REQUEST_TYPE === "socket") {
    const wsInstance = WebSocketSingleton.getInstance();
    wsInstance.sendMessage({ methodName, params });
  }
};
